package xkp.lesson1;

import java.util.HashMap;
import java.util.HashSet;

public class Test1 {
    public static void main(String[] args) {
        //Collection系列
        //1、ArrayList
        //2、LinkedList
        //3、HashSet
        //*******上述三种数据结构都是(线性的)********
        //Map系列  映射 存储键值对 类似表格
        HashMap<String,Person> map = new HashMap<String, Person>();



        Person person1 = new Person("张三",20);
        Person person2 = new Person("张三",20);
        System.out.println(person1.equals(person2));
        System.out.println(person1.hashCode() == person2.hashCode());

        map.put("user1",person1);
        map.put("user2",person2);
        map.put("user3",new Person());
        map.put("qwjdq",new Person());
        map.put("user1",new Person());
        //HashMap底层数据结构
        //数组+链表+红黑树(?,?,?,?,?)
        //元素具体放在哪个位置，是由key值决定的
        //在HashMap中key是关键
        //key不能重复,本质上是Set集合  hashcode()与equals()组合判断是否重复
        //在HashMap中如果hashcode()值重复，equals()值也重复，则变成元素替换
        //HashMap为什么无序
        //当链表中的元素个数超过8个是，会进行Hash重排(Hashcode值重新生成)
        //当数组元素个数不够时也会进行扩容，扩容时hashcode也会重新生成。
        //HashMap是无序的 当数据量大的时候该情况比较明显

        //如果重写equals()必须要重写hashcode()  因为equals相等则hashcode必须一致
        //如果重写了hashcode(),必须重写equals()吗????
        //如果hashcode一致，则equals()没要求
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
        System.out.println(person1.equals(person2));
        //在HashMap中我们应该关注的是key值的hashcode()和equals()
        //在HashMap中是根据key值去存放数据

        HashMap<Person,Object> hashMap2 = new HashMap<>();
        //注意此处Person作为key去使用，则应该注意Person中的hashcode和equals，如果重写了equals()，则必须重写hashcode()
        //最终的效果是当equals方法返回true时两者的hashcode必须相等
        HashSet<Person> hashSet = new HashSet<>();

    }
}
